/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2008，所有权利保留。
 * 
 * 项目名： rumba-web
 * 文件名： RBAsyncCallback.java
 * 模块说明：    
 * 修改历史：
 * Sep 18, 2008 - lxm - 创建。
 */
package com.hd123.rumba.gwt.base.client;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.hd123.rumba.gwt.base.client.exception.NoLoginException;
import com.hd123.rumba.gwt.util.client.GWTUtil;

/**
 * Rumba提供的RPC异步调用回调类。用于替代大部分情况下使用AsyncCallback的场景。
 * <p>
 * 包括以下功能：当尚未登录或长时间未使用导致Session过期时，自动提示操作者，确定将要求重新登录。
 * <p>
 * 相对于RBAsyncCallback，由于改进了GWTModuleServlet的写法，
 * 现在客户端已经确定能够接收到NoLoginException， 所以不需要多重判断了。LiQi,2009-04-15
 * 
 * @author lxm
 */
public abstract class RBAsyncCallback2<T> implements AsyncCallback<T> {

  /**
   * 当发生异常时被调用。
   * 
   * @param t
   *          指定异常。
   */
  public abstract void onException(Throwable caught);

  public abstract void onSuccess(T result);

  /**
   * 当发生未登录异常时被调用。
   * 
   * @param caught
   * @return 返回true表示执行标准的异常处理，否则返回false。
   */
  public boolean onNoLoginException(Throwable caught) {
    // Do Nothing
    return true;
  }

  public final void onFailure(Throwable caught) {
    if (caught instanceof NoLoginException) {
      onNoLoginException(caught);
      Window.alert("对不起！您已经长时间没有使用系统，或者尚未登录。\n\n请确定后重新登录。");
      GWTUtil.closeWindow();
      GWTUtil.navigate(GWTUtil.getWebAppBaseURL(), "_blank");
    } else {
      onException(caught);
    }
  }

  /**
   * 根据传入的AsyncCallback生成一个默认的实例，这个实例只是简单的把事件传递给callback
   * <p>
   * 可用于RGridPageDataProvider的实现类
   * 
   * @param callback
   * @return
   */
  public static RBAsyncCallback2 getDefaultInstance(final AsyncCallback callback) {
    RBAsyncCallback2 result = new RBAsyncCallback2() {
      public void onException(Throwable caught) {
        callback.onFailure(caught);
      }

      public void onSuccess(Object result) {
        callback.onSuccess(result);
      }
    };
    return result;
  }
}
